home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 44 / Amiga Format CD44 (1999-08-26)(Future Publishing)(GB)(Track 1 of 3)[!][issue 1999-10].iso / -in_the_mag- / basics / amos / easylife110pt1.lha / AmosGuide.AMOS / AmosGuide.amosSourceCode next >
AMOS Source Code  |  1995-04-17  |  40KB  |  1,362 lines

  1. '****************************************************************************
  2. '**   Amos Guide  -  AmigaGuide File Viewer & AMOSPro Help System V1.02    **
  3. '**            By Paul Hickman ph@doc.ic.ac.uk  - ï¿½April 1995              **
  4. '****************************************************************************
  5. Set Buffer 32
  6. Set Accessory 
  7.  
  8. 'Structures Begin  
  9. '
  10. '      const nodenamelen = 30
  11. 'local const filenamelen = 128 
  12. '      const textlen     = 50
  13. '
  14. 'enum guidemode : normal,help,keyword,bank,dir   
  15. '
  16. 'enum linktype : node,amos,unknown 
  17. '
  18. 'node : structure
  19. '
  20. '   next  : pointer to node
  21. '   name  : string length nodenamelen  
  22. '   pos   : cardinal 
  23. '   len   : uword  
  24. '    
  25. '  
  26. 'end 
  27. '
  28. '
  29. 'database : structure
  30. '
  31. '   name    : string length nodenamelen  
  32. '   file    : string length filenamelen  
  33. '   author  : string length textlen  
  34. '   copy    : string length textlen  
  35. '   version : string length textlen
  36. '   master  : string length textlen
  37. '   nodes : pointer to node  
  38. '   akas  : pointer to aka 
  39. '   index : string length filenamelen
  40. '
  41. 'end 
  42. '
  43. '
  44. 'aka : structure 
  45. '   name : string length nodenamelen 
  46. '   node : string length nodenamelen 
  47. '   next : pointer to aka
  48. 'end 
  49. '
  50. '
  51. 'link : structure
  52. '
  53. '   next : pointer to link 
  54. '   name : string length filenamelen 
  55. '   x1   : uword 
  56. '   y1   : uword 
  57. '   x2   : uword 
  58. '   y2   : uword 
  59. '   type : enum linktype   
  60. '
  61. 'end 
  62. '
  63. '
  64. 'slider : structure
  65. '
  66. '   x1    : uword  
  67. '   y1    : uword  
  68. '   x2    : uword  
  69. '   y2    : uword  
  70. '   pos   : cardinal   
  71. '   max   : cardinal   
  72. '   bsize : cardinal 
  73. '   horiz : boolean
  74. '
  75. 'end 
  76. '
  77. '
  78. 'retrace : structure 
  79. '
  80. '  previous : pointer to retrace 
  81. '  file     : string length filenamelen  
  82. '  node     : string length nodenamelen  
  83. '  xpos     : cardinal 
  84. '  ypos     : cardinal 
  85. '  mode     : enum guidemode   
  86. '
  87. 'end 
  88. '
  89. '
  90. '
  91. 'Structures Constants
  92.  
  93. Global ST_NODE,ST_NEXT,ST_NAME,ST_POS,ST_LEN
  94. ST_NODE=20 : ST_NEXT=34 : ST_NAME=48 : ST_POS=66 : ST_LEN=76
  95. Global ST_DATABASE,ST_NODES,ST_AKAS,ST_FILE,ST_AUTHOR
  96. ST_DATABASE=82 : ST_NODES=88 : ST_AKAS=94 : ST_FILE=100 : ST_AUTHOR=110
  97. Global ST_COPY,ST_VERSION,ST_MASTER,ST_INDEX,ST_AKA
  98. ST_COPY=116 : ST_VERSION=122 : ST_MASTER=128 : ST_INDEX=134 : ST_AKA=140
  99. Global ST_LINK,ST_X1,ST_Y1,ST_X2,ST_Y2,ST_TYPE
  100. ST_LINK=146 : ST_X1=152 : ST_Y1=162 : ST_X2=172 : ST_Y2=182 : ST_TYPE=192
  101. Global ST_SLIDER,ST_MAX,ST_BSIZE,ST_HORIZ,ST_RETRACE
  102. ST_SLIDER=198 : ST_MAX=204 : ST_BSIZE=210 : ST_HORIZ=216 : ST_RETRACE=222
  103. Global ST_PREVIOUS,ST_XPOS,ST_YPOS,ST_MODE
  104. ST_PREVIOUS=228 : ST_XPOS=234 : ST_YPOS=240 : ST_MODE=246
  105. Global __NODENAMELEN,__TEXTLEN,__NORMAL,__HELP,__KEYWORD
  106. __NODENAMELEN=30 : __TEXTLEN=50 : __NORMAL=0 : __HELP=1 : __KEYWORD=2
  107. Global __BANK,__DIR,__NODE,__AMOS,__UNKNOWN
  108. __BANK=3 : __DIR=4 : __NODE=0 : __AMOS=1 : __UNKNOWN=2
  109.  
  110. 'Structures End  
  111.  
  112. EDAT=Leek(Dreg(3))
  113. COM$=Command Line$
  114. Global CUR_FILE$,PATH$,_CONTENT$,_NEXT$,_PREV$,TABSIZE,DB,_TITLE$,RETRACE
  115. Global BANK,HD$
  116. TABSIZE=8 : BLOCK_SIZE=8192 : STYLE=0
  117.  
  118.  
  119. '****************************************************************************
  120. '* Obtain the filename of the guide file to display / bank pointer, and the
  121. '* initial database node, by decoding the command line 
  122.  
  123. 'Clever (If I say so myself) hack to obtain the location of the
  124. 'easylife help directory as long as it is multiply assigned to HELP: 
  125.  
  126. If Exist("HELP:AMOSPro")
  127.    D$=Dir$
  128.    Dir$="HELP:AMOSPro"
  129.    HD$=Left$(Dir$,Len(Dir$)-8)
  130.    Dir$=D$
  131. Else 
  132.    'Use the default extracted location if help files cannot be found
  133.    HD$="Easylife2:Docs/"
  134. End If 
  135.  
  136. GT_FIRSTWORD[COM$] : C$=Param$
  137. If C$="HELP"
  138.    FILE$=HD$
  139.    GT_NEXTWORD
  140.    NAME$=Lower$(Param$)
  141.    If NAME$="" : NAME$="main" : End If 
  142.    GMODE=__HELP
  143.    
  144. Else If Left$(C$,4)="Help"
  145.    FILE$=HD$+"AMOSPro/AMOSPro_Help.Guide"
  146.    NAME$=Lower$(C$)
  147.    GMODE=__HELP
  148.    
  149. Else If C$="KEYWORD"
  150.    GMODE=__KEYWORD
  151.    NAME$=""
  152.    FILE$=HD$+"AMOSPro/AMOSPro_Help.Guide"
  153.    If Extension_16_07DA(FILE$)>=0
  154.       FILE$=HD$+"Extensions/Easylife.Guide"
  155.       If Extension_16_07DA(FILE$)>=0
  156.          GMODE=__NORMAL
  157.       End If 
  158.    End If 
  159.    
  160. Else If C$="BANK"
  161.    GT_NEXTWORD
  162.    BANK=Val(Param$)
  163.    If BANK=0 : Error 23 : End If 
  164.    If Blength(BANK)=0 : Error 36 : End If 
  165.    GT_NEXTWORD
  166.    NAME$=Lower$(Param$)
  167.    If NAME$=""
  168.       NAME$="main"
  169.    End If 
  170.    GT_NEXTWORD
  171.    PATH$=Param$
  172.    GMODE=__BANK
  173.    
  174. Else If C$<>""
  175.    FILE$=C$
  176.    GT_NEXTWORD
  177.    NAME$=Lower$(Param$)
  178.    If NAME$="" : NAME$="main" : End If 
  179.    GMODE=__NORMAL
  180. End If 
  181.  
  182. If FILE$<>""
  183.    If Extension_16_07DA(FILE$)>=0 : GMODE=__NORMAL : NAME$="" : End If 
  184. End If 
  185.  
  186. If(NAME$="") and(GMODE<>__KEYWORD)
  187.    FILE$=Fsel$("*.guide","","Select An Amigaguide File To View")
  188.    If FILE$="" : FILE$=Dir$ : End If 
  189.    NAME$="main" : GMODE=__NORMAL
  190. End If 
  191.  
  192.  
  193. ' Will only have effect if program is NOT an accessory!
  194. Close Editor 
  195. ' If the program is called from the editor, from some memory 
  196. If Prg Under=1
  197.    For S=0 To 7 : Trap Screen Close S : Next S
  198. End If 
  199.  
  200. 'Copy editor screens position. 
  201. '
  202. W=Deek(EDAT)
  203. H=Deek(EDAT+2)
  204. XP=Deek(EDAT+4)
  205. YP=Deek(EDAT+6)
  206.  
  207. 'When run as an accessory, move top of screen below editor titlebar  
  208. '
  209. If Prg Under=1
  210.    H=H-16 : YP=YP+16
  211. End If 
  212.  
  213. 'Generate Screen 
  214. '
  215. Auto View Off 
  216. INIT_SCRN[W,H]
  217. Screen Display 0,XP,YP,,
  218. INIT_SLIDERS
  219. Auto View On : View 
  220.  
  221. 'Seperate filename from path 
  222. '
  223. If FILE$<>""
  224.    SEP= Extension_16_010C(FILE$,47)
  225.    If SEP=0
  226.       SEP= Extension_16_010C(FILE$,58)
  227.    End If 
  228.    PATH$=Left$(FILE$,SEP)
  229. End If 
  230.  
  231. 'Load initial .guide file
  232. '
  233. DB_READ[FILE$]
  234. If Param
  235.    If GMODE=__KEYWORD
  236.       'Keyword mode - must find keyword node in file now...  
  237.       
  238.       Ask Editor 1 : L$=Lower$(Param$)
  239.       Ask Editor 3 : X=Param
  240.       
  241.       X1= Extension_16_0122(L$,32,X)
  242.       SX= Extension_16_00DE(L$,32,X1)
  243.       
  244.       EX= Extension_16_0100(L$,"abcdefghijklmnopqrstuvwxyz #$",SX)
  245.       If(SX=0)
  246.          NAME$="main"
  247.       Else 
  248.          If EX=0 : EX=Len(L$)+1 : End If 
  249.          LOOKUP_COMMAND[Mid$(L$,SX,EX-SX)-" "] : NAME$=Param$
  250.       End If 
  251.    End If 
  252.    
  253.    'View the database from node NAME$ 
  254.    '
  255.    DB_VIEW[NAME$]
  256. End If 
  257. Change Mouse 1
  258.  
  259. 'End of program - return to editor / calling program 
  260. '*************************************************** 
  261.  
  262. '********************
  263. 'Database/Node Reading 
  264.  
  265. Procedure LOOKUP_COMMAND[K$]
  266.    Shared GMODE
  267.    EXT=False
  268.    NAME$=""
  269.    Repeat 
  270.       'Search Nodes of this database 
  271.       '
  272.       N= Extension_16_0D32(DB,ST_NODES)
  273.       While N
  274.          N$= Extension_16_0CF8(N,ST_NAME)
  275.          If Left$(N$,2)="c_"
  276.             N$=Mid$(N$,3)
  277.             If Left$(K$,Len(N$))=N$
  278.                If Len(N$)>Len(NAME$)
  279.                   NAME$=N$ : FILE$=CUR_FILE$
  280.                End If 
  281.                Exit If Len(N$)=Len(K$)
  282.             End If 
  283.          End If 
  284.          N= Extension_16_0D32(N,ST_NEXT)
  285.       Wend 
  286.       
  287.       'Search Akas of this database
  288.       N= Extension_16_0D32(DB,ST_AKAS)
  289.       While N
  290.          N$= Extension_16_0CF8(N,ST_NAME)
  291.          If Left$(N$,2)="c_"
  292.             N$=Mid$(N$,3)
  293.             If Left$(K$,Len(N$))=N$
  294.                If Len(N$)>Len(NAME$)
  295.                   NAME$=Mid$( Extension_16_0CF8(N,ST_NODE),3) : FILE$=CUR_FILE$
  296.                End If 
  297.                Exit If Len(N$)=Len(K$)
  298.             End If 
  299.          End If 
  300.          N= Extension_16_0D32(N,ST_NEXT)
  301.       Wend 
  302.       If NAME$<>K$
  303.          'Command not found in AMOSPro Help - Check Extensions
  304.          '
  305.          
  306.          If EXT
  307.             EXT$=Dir Next$
  308.          Else 
  309.             EXT=True
  310.             EXT$=Dir First$(HD$+"Extensions/*.guide")
  311.          End If 
  312.          Exit If EXT$=""
  313.          EXT$=Mid$(EXT$,2, Extension_16_016C(EXT$,32,Len(EXT$)-8)-1)
  314.          DB_READ[HD$+"Extensions/"+EXT$]
  315.       End If 
  316.    Until NAME$=K$
  317.    If NAME$=""
  318.       NAME$="main" : FILE$=HD$+"AMOSPro/AMOSPro_Help.Guide"
  319.    Else 
  320.       NAME$="c_"+NAME$
  321.    End If 
  322.    GMODE=__NORMAL
  323.    If FILE$<>CUR_FILE$
  324.       DB_READ[FILE$]
  325.    End If 
  326. End Proc[NAME$]
  327. Procedure DB_READ[F$]
  328.    Shared FR_POS,GMODE
  329.    '
  330.    Change Mouse 3
  331.    WHITE$=Chr$(32)+Chr$(9)+Chr$(10)
  332.    'Check if this database has been turbo'd 
  333.    '
  334.    If(F$<>"") and( Extension_16_07DA(F$+".tbo")<0)
  335.       NDB= Extension_16_0C4A(F$+".tbo")
  336.       CUR_FILE$=F$
  337.       If GMODE<>__KEYWORD : GMODE=__NORMAL : End If 
  338.    Else If(F$<>"") and( Extension_16_07DA(F$+"/")>0)
  339.       'F$ is really a directory! 
  340.       
  341.       GMODE=__DIR
  342.       If(Right$(F$,1)<>":") and(Right$(F$,1)<>"/") : F$=F$+"/" : End If 
  343.       If Extension_16_07DA(F$+".GuideHeader")<0
  344.          Open In 1,F$+".GuideHeader" : DL_TXT$=Input$(1,Lof(1)) : Close 1
  345.       Else 
  346.          DL_TXT$='@node main "Directory Listing"'+Chr$(10)
  347.          DL_TXT$=DL_TXT$+'@{b}Directory Listing:@{ub}'+Chr$(10)+Chr$(10)
  348.       End If 
  349.       
  350.       Set Dir 80 : D$=Dir First$(F$)
  351.       While D$<>""
  352.          D=(Asc(D$)=42)
  353.          D$=Mid$(D$,2, Extension_16_016C(D$,32,34)-1)
  354.          If(Lower$(Right$(D$,6))=".guide") or(D=True)
  355.             DL_TXT$=DL_TXT$+Chr$(9)+'@{"'+D$+Space$(35-Len(D$))+'" link "'+F$+D$+'/main"}'+Chr$(10)
  356.          End If 
  357.          D$=Dir Next$
  358.       Wend 
  359.       
  360.       Reserve As Work 13,Len(DL_TXT$)
  361.        Extension_16_02BE Start(13),DL_TXT$
  362.       
  363.       NDB= Extension_16_0C3C(ST_DATABASE)
  364.        Extension_16_0D76 NDB,ST_FILE To Lower$(F$)
  365.       
  366.       N= Extension_16_0C3C(ST_NODE)
  367.        Extension_16_0D76 N,ST_NAME To "main"
  368.        Extension_16_0DB8 N,ST_POS To 0
  369.        Extension_16_0DB8 N,ST_LEN To Len(DL_TXT$)
  370.        Extension_16_0DB8 NDB,ST_NODES To N
  371.       
  372.    Else 
  373.       If GMODE<>__KEYWORD : GMODE=__NORMAL : End If 
  374.       _FILE_READ[1,F$] : FL=Param
  375.       If Param=0 : Pop Proc[False] : End If 
  376.       
  377.       _FILE_READ_LINE[1] : N$=Param$
  378.       N$=Mid$(N$, Extension_16_00EA(N$,WHITE$))
  379.       If Lower$(Left$(N$,10))<>"@database "
  380.          _ERRORMSG["Not an amigaguide file: "+F$]
  381.          Pop Proc[False]
  382.       End If 
  383.       
  384.       CUR_FILE$=F$
  385.       NDB= Extension_16_0C3C(ST_DATABASE)
  386.        Extension_16_0D76 NDB,ST_FILE To Lower$(F$)
  387.       N$=Mid$(N$, Extension_16_0100(N$,Chr$(32)+Chr$(9),10))
  388.       If Asc(N$)=34
  389.          If Asc(Right$(N$,1))<>34
  390.             _ERRORMSG["Unmatched Quote"]
  391.             Pop Proc[False]
  392.          Else 
  393.             N$=Mid$(N$,2,Len(N$)-2)
  394.          End If 
  395.       End If 
  396.        Extension_16_0D76 NDB,ST_NAME To Lower$(N$)
  397.       N=0
  398.       Repeat 
  399.          OPOF=FR_POS
  400.          _FILE_READ_LINE[1] : L$=Param$
  401.          Exit If Errtrap
  402.          GT_FIRSTWORD[L$] : N$=Lower$(Param$)
  403.          If N$="@node"
  404.             N= Extension_16_0C3C(ST_NODE)
  405.             GT_NEXTWORD
  406.              Extension_16_0D76 N,ST_NAME To Left$(Lower$(Param$),__NODENAMELEN)
  407.             
  408.              Extension_16_0DB8 N,ST_POS To OPOF
  409.              Extension_16_0DB8 N,ST_LEN To 0
  410.             
  411.              Extension_16_0DB8 N,ST_NEXT To Extension_16_0D32(NDB,ST_NODES)
  412.              Extension_16_0DB8 NDB,ST_NODES To N
  413.             
  414.          Else If(N$="@aka") and(N>0)
  415.             GT_NEXTWORD : _ADD_AKA[NDB,Param$, Extension_16_0CF8(N,ST_NAME)]
  416.             
  417.          Else If N$="@endnode"
  418.             If N>0
  419.                 Extension_16_0DB8 N,ST_LEN To OPOF- Extension_16_0D32(N,ST_POS)
  420.                N=0
  421.             End If 
  422.          Else If N$="@index"
  423.             GT_NEXTWORD : N$=Lower$(Param$)
  424.              Extension_16_0D76 NDB,ST_INDEX To N$
  425.          Else If N$="@$ver:"
  426.              Extension_16_0D76 NDB,ST_VERSION To Mid$(L$, Extension_16_00DE(L$,32,6),__TEXTLEN)
  427.          Else If N$="@author"
  428.              Extension_16_0D76 NDB,ST_AUTHOR To Mid$(L$, Extension_16_00DE(L$,32,7),__TEXTLEN)
  429.          Else If N$="@(c)"
  430.              Extension_16_0D76 NDB,ST_COPY To Mid$(L$, Extension_16_00DE(L$,32,4),__TEXTLEN)
  431.          Else If N$="@master"
  432.              Extension_16_0D76 NDB,ST_MASTER To Mid$(L$, Extension_16_00DE(L$,32,7),__TEXTLEN)
  433.          End If 
  434.       Until FR_POS>=FL
  435.       
  436.       _FILE_CLOSE[1]
  437.    End If 
  438.    
  439.    If DB Then Extension_16_0E18 DB
  440.    Bank Swap 11,13 : Erase 13
  441.    DB=NDB
  442. End Proc[True]
  443. Procedure NODE_READ[NAME$,XL,YL,RET,KEY]
  444.    Shared NODE$,NODE,GMODE
  445.    
  446.    If NODE
  447.       CDB$= Extension_16_0CF8(DB,ST_FILE)
  448.       CN$= Extension_16_0CF8(NODE,ST_NAME)
  449.       G_MODE=GMODE
  450.    End If 
  451.    
  452.    
  453.    If KEY
  454.       GMODE=__KEYWORD
  455.       LOOKUP_COMMAND[NAME$] : NAME$=Param$
  456.    Else 
  457.       SEP= Extension_16_008C(NAME$,47)
  458.       If SEP>0
  459.          'Node is in another database!
  460.          '
  461.          
  462.          If Extension_16_008C(NAME$,58)=0
  463.             'Relative Path is given
  464.             '
  465.             NAME$=PATH$+NAME$
  466.          End If 
  467.          
  468.          SEP= Extension_16_010C(NAME$,47)
  469.          If SEP=0
  470.             SEP= Extension_16_010C(NAME$,58)
  471.          End If 
  472.          
  473.          F$=Left$(NAME$,SEP-1)
  474.          NAME$=Mid$(NAME$,SEP+1)
  475.          If Lower$(F$)<>Lower$( Extension_16_0CF8(DB,ST_FILE))
  476.             DB_READ[F$] : If Param=0 : Pop Proc[False] : End If 
  477.          End If 
  478.       Else 
  479.          If NODE
  480.             If NAME$= Extension_16_0CF8(NODE,ST_NAME)
  481.                Pop Proc[0]
  482.             End If 
  483.          End If 
  484.       End If 
  485.    End If 
  486.    'Node is in this database
  487.    '
  488.    'NOTE: _NEXT$ & _PREV$ appear to be back to front as nodes a listed
  489.    '      last to first.
  490.    '
  491.    N= Extension_16_0D32(DB,ST_NODES) : P=-1
  492.    _NEXT$= Extension_16_0CF8(N,ST_NAME)
  493.    While N
  494.       If Extension_16_0DFA(N,ST_NAME To NAME$)=0
  495.          P= Extension_16_0D32(N,ST_POS) : L= Extension_16_0D32(N,ST_LEN) : Exit 
  496.       End If 
  497.       _NEXT$= Extension_16_0CF8(N,ST_NAME)
  498.       N= Extension_16_0D32(N,ST_NEXT)
  499.    Wend 
  500.    
  501.    If P=-1
  502.       _ERRORMSG["Node "+NAME$+" not found"]
  503.       N=0
  504.    Else 
  505.       NN= Extension_16_0D32(N,ST_NEXT)
  506.       If NN=0
  507.          PV$= Extension_16_0CF8(N,ST_NAME)
  508.       Else 
  509.          PV$= Extension_16_0CF8(NN,ST_NAME)
  510.       End If 
  511.       
  512.       If L=0
  513.          _ERRORMSG["Node "+NAME$+" has no endnode"]
  514.          N=0
  515.       Else 
  516.          _PREV$=PV$ : _CONTENT$="main" : NODE$=""
  517.          If GMODE=__DIR
  518.             'Contents Of A Directory is the Parent Dir 
  519.             SEP= Extension_16_010C(F$,47)
  520.             If SEP=0
  521.                SEP= Extension_16_010C(NAME$,58)
  522.             End If 
  523.             If SEP=0
  524.                _CONTENT$=F$
  525.             Else 
  526.                _CONTENT$=Left$(F$,SEP-1)
  527.             End If 
  528.             _CONTENT$=_CONTENT$+"/main"
  529.          End If 
  530.          If(RET=False) and(NODE<>0)
  531.             RT= Extension_16_0C3C(ST_RETRACE)
  532.              Extension_16_0D76 RT,ST_FILE To CDB$
  533.              Extension_16_0D76 RT,ST_NODE To CN$
  534.              Extension_16_0DB8 RT,ST_XPOS To XL
  535.              Extension_16_0DB8 RT,ST_YPOS To YL
  536.              Extension_16_0DB8 RT,ST_PREVIOUS To RETRACE
  537.              Extension_16_0DB8 RT,ST_MODE To G_MODE
  538.             RETRACE=RT
  539.          End If 
  540.          
  541.          If GMODE=__DIR
  542.             ST=Start(11) : L=Length(11)
  543.          Else If GMODE=__BANK
  544.             ST=Bstart(BANK)+P
  545.          Else 
  546.             Erase 10 : Reserve As Work 10,L
  547.             Open In 1, Extension_16_0CF8(DB,ST_FILE)
  548.             Pof(1)=P : Sload 1 To Start(10),L
  549.             Close 1 : ST=Start(10)
  550.          End If 
  551.          
  552.          A$= Extension_16_0292(ST,65535,10)
  553.          A=Len(A$)+1
  554.          GT_FIRSTWORD[A$]
  555.          GT_NEXTWORD
  556.          GT_NEXTWORD
  557.          _TITLE$=Param$
  558.          
  559.          While A<L
  560.             A$= Extension_16_0292(ST+A,65535,10)
  561.             
  562.             GT_FIRSTWORD[A$] : C$=Param$
  563.             If C$="@toc"
  564.                GT_NEXTWORD : _CONTENT$=Lower$(Param$)
  565.             Else If C$="@prev"
  566.                GT_NEXTWORD : _PREV$=Lower$(Param$)
  567.             Else If C$="@next"
  568.                GT_NEXTWORD : _NEXT$=Lower$(Param$)
  569.             Else If C$="@title"
  570.                GT_NEXTWORD : _TITLE$=Param$
  571.             Else If(Left$(C$,1)<>"@") or(Mid$(C$,2,1)="{")
  572.                NODE$=NODE$+ Extension_16_04CE(ST+A)
  573.             End If 
  574.             Add A,Len(A$)+1
  575.          Wend 
  576.       End If 
  577.    End If 
  578. End Proc[N]
  579. Procedure _ADD_AKA[DBASE,AKA$,N$]
  580.    A= Extension_16_0C3C(ST_AKA)
  581.     Extension_16_0D76 A,ST_NAME To Lower$(AKA$)
  582.     Extension_16_0D76 A,ST_NODE To Lower$(N$)
  583.     Extension_16_0DB8 A,ST_NEXT To Extension_16_0D32(DBASE,ST_AKAS)
  584.     Extension_16_0DB8 DBASE,ST_AKAS To A
  585. End Proc
  586.  
  587. '********************
  588. 'Node Display
  589.  
  590. Procedure DB_VIEW[NAME$]
  591.    Shared NODE$,HSLD,VSLD,NODE
  592.    RET=False : KEY=False : XL=0 : YL=0
  593.    Do 
  594.       Change Mouse 3
  595.       NODE_READ[NAME$, Extension_16_0D32(HSLD,ST_POS), Extension_16_0D32(VSLD,ST_POS),RET,KEY]
  596.       If Param
  597.          NODE=Param
  598.          BUILD_LINKS : MXP=Param
  599.          
  600.          Limit Mouse X Hard(0),Y Hard(0) To X Hard(Screen Width),Y Hard(Screen Height)
  601.          
  602.           Extension_16_0DB8 HSLD,ST_POS To XL
  603.           Extension_16_0DB8 VSLD,ST_POS To YL
  604.           Extension_16_0DB8 HSLD,ST_MAX To Max(0,MXP- Extension_16_0D32(HSLD,ST_BSIZE))
  605.           Extension_16_0DB8 VSLD,ST_MAX To Max(0,Len(NODE$)/4- Extension_16_0D32(VSLD,ST_BSIZE))
  606.          
  607.          SLIDER_DRAW[HSLD]
  608.          SLIDER_DRAW[VSLD]
  609.          _INDEX$= Extension_16_0CF8(DB,ST_INDEX)
  610.          _VIEW_PAGE[ Extension_16_0D32(HSLD,ST_POS), Extension_16_0D32(VSLD,ST_POS)]
  611.       End If 
  612.       Change Mouse 1 : View : XL=0 : YL=0 : RET=False : KEY=False
  613.       Do 
  614.          Vdialog$(1,1)=_TITLE$
  615.          Wait Vbl 
  616.          BT=Dialog Run(1)
  617.          Repeat : BT=Dialog(1) : Until(BT>0) or Choice
  618.          K=Key Shift
  619.          C=0 : If BT=0 Then C=Choice(2)
  620.          SLDDIST=1 : If(K and 3)>0 Then SLDDIST=15
  621.          Pen 0 : Paper 3
  622.          Exit If(BT=1) or(C=10),2
  623.          If BT=8
  624.             NAME$=_CONTENT$
  625.             Exit 
  626.          End If 
  627.          If(BT=9) and(_INDEX$<>"")
  628.             NAME$=_INDEX$
  629.             Exit 
  630.          End If 
  631.          If(BT=10)
  632.             NAME$=_PREV$
  633.             Exit 
  634.          End If 
  635.          If(BT=11)
  636.             NAME$=_NEXT$
  637.             Exit 
  638.          End If 
  639.          If(BT=12) and(RETRACE<>0)
  640.             If Extension_16_0D32(RETRACE,ST_MODE)=__BANK
  641.                NAME$=""
  642.             Else 
  643.                NAME$= Extension_16_0CF8(RETRACE,ST_FILE)
  644.             End If 
  645.             NAME$=NAME$+"/"+ Extension_16_0CF8(RETRACE,ST_NODE)
  646.             XL= Extension_16_0D32(RETRACE,ST_XPOS) : YL= Extension_16_0D32(RETRACE,ST_YPOS)
  647.             RETRACE= Extension_16_0D32(RETRACE,ST_PREVIOUS) : RET=True
  648.             Exit 
  649.          End If 
  650.          If(BT=13)
  651.             _TEST_LINKS[ Extension_16_0D32(HSLD,ST_POS), Extension_16_0D32(VSLD,ST_POS)]
  652.             If Param$<>""
  653.                NAME$=Param$
  654.                Exit 
  655.             End If 
  656.          End If 
  657.          If(BT=2)
  658.             SLIDER_READ[VSLD]
  659.             _VIEW_PAGE[ Extension_16_0D32(HSLD,ST_POS), Extension_16_0D32(VSLD,ST_POS)]
  660.          End If 
  661.          If(BT=3)
  662.              Extension_16_0DB8 VSLD,ST_POS To Max(0, Extension_16_0D32(VSLD,ST_POS)-SLDDIST)
  663.             SLIDER_DRAW[VSLD]
  664.             _VIEW_PAGE[ Extension_16_0D32(HSLD,ST_POS), Extension_16_0D32(VSLD,ST_POS)]
  665.          End If 
  666.          If(BT=4)
  667.              Extension_16_0DB8 VSLD,ST_POS To Min( Extension_16_0D32(VSLD,ST_MAX), Extension_16_0D32(VSLD,ST_POS)+SLDDIST)
  668.             SLIDER_DRAW[VSLD]
  669.             _VIEW_PAGE[ Extension_16_0D32(HSLD,ST_POS), Extension_16_0D32(VSLD,ST_POS)]
  670.          End If 
  671.          If(BT=5)
  672.             SLIDER_READ[HSLD]
  673.             _VIEW_PAGE[ Extension_16_0D32(HSLD,ST_POS), Extension_16_0D32(VSLD,ST_POS)]
  674.          End If 
  675.          If(BT=6)
  676.              Extension_16_0DB8 HSLD,ST_POS To Max(0, Extension_16_0D32(HSLD,ST_POS)-SLDDIST)
  677.             SLIDER_DRAW[HSLD]
  678.             _VIEW_PAGE[ Extension_16_0D32(HSLD,ST_POS), Extension_16_0D32(VSLD,ST_POS)]
  679.          End If 
  680.          If(BT=7)
  681.              Extension_16_0DB8 HSLD,ST_POS To Min( Extension_16_0D32(HSLD,ST_MAX), Extension_16_0D32(HSLD,ST_POS)+SLDDIST)
  682.             SLIDER_DRAW[HSLD]
  683.             _VIEW_PAGE[ Extension_16_0D32(HSLD,ST_POS), Extension_16_0D32(VSLD,ST_POS)]
  684.          End If 
  685.          
  686.          '******** Open New Database
  687.          '* 
  688.          If(C=1)
  689.             F$=Fsel$("*.guide","","Select An Amigaguide File To View")
  690.             If F$<>""
  691.                If Right$(F$,1)<>"/"
  692.                   NAME$=F$+"/main"
  693.                Else 
  694.                   NAME$=F$+"main"
  695.                End If 
  696.                Exit 
  697.             End If 
  698.          End If 
  699.          
  700.          '******** Command Search 
  701.          '* 
  702.          If(C=2)
  703.             STRING_REQUEST["Search for help on AMOSPro / Extension Command","Command :",""]
  704.             NAME$=Lower$(Param$)-" " : KEY=True : Exit 
  705.          End If 
  706.          
  707.          '******** Turbo Charge Database
  708.          '* 
  709.          If(C=4)
  710.             If CUR_FILE$<>""
  711.                Change Mouse 3
  712.                 Extension_16_0C58 CUR_FILE$+".tbo",DB
  713.                Change Mouse 1
  714.             End If 
  715.          End If 
  716.          If(C=5)
  717.             _PRINT_PAGE
  718.          End If 
  719.          '******** About Amos Guide 
  720.          '* 
  721.          If(C=7)
  722.             ABOUT_TEXT[True]
  723.             _VIEW_PAGE[ Extension_16_0D32(HSLD,ST_POS), Extension_16_0D32(VSLD,ST_POS)]
  724.          End If 
  725.          
  726.          If(C=8)
  727.             ABOUT_DATABASE
  728.             _VIEW_PAGE[ Extension_16_0D32(HSLD,ST_POS), Extension_16_0D32(VSLD,ST_POS)]
  729.          End If 
  730.       Loop 
  731.    Loop 
  732.    _CLOSE_SCREEN
  733. End Proc
  734. Procedure _VIEW_PAGE[XL,YL]
  735.    Shared NODE$
  736.    Y=32 : A=1+YL*4
  737.    Clip 0,32 To Screen Width-16,Screen Height-10
  738.    Cls 2,0,32 To Screen Width-16,Screen Height-10
  739.    Repeat 
  740.       LINE_VIEW[ Extension_16_04DC(Mid$(NODE$,A,4)),0,Y,XL]
  741.       Add Y,10 : Add A,4
  742.       Exit If A>=Len(NODE$)
  743.    Until Y>Screen Height-10
  744.    _SHOW_LINKS[XL,YL]
  745.    Clip 0,0 To Screen Width,Screen Height
  746. End Proc
  747. Procedure BUILD_LINKS
  748.    Shared QUOTED,LINKS,NODE$
  749.    
  750.    If LINKS
  751.        Extension_16_0E18 LINKS
  752.       LINKS=0
  753.    End If 
  754.    
  755.    Y=0 : MXP=0
  756.    For Q=0 To Len(NODE$)-1 Step 4
  757.       LADDR=Leek(Varptr(NODE$)+Q)
  758.       
  759.       L$= Extension_16_0292(LADDR,65535,10)
  760.       B=1 : A= Extension_16_008C(L$,64) : XP=0
  761.       
  762.       While A
  763.          If Mid$(L$,A-1,1)="\"
  764.             A= Extension_16_008C(L$,A)
  765.          Else 
  766.             TAB_OVER[Mid$(L$,B,A-B),XP] : XP=Param
  767.             
  768.             If((A>1) and Peek(LADDR+A-1)=92) or Peek(LADDR+A)<>123
  769.                '@ is escaped or not followed by { so ignore it. 
  770.                '
  771.                B=A : A= Extension_16_009E(L$,64,B)
  772.             Else 
  773.                GT_FIRSTWORD[Mid$(L$,A+2)] : C$=Param$
  774.                If QUOTED
  775.                   GT_NEXTWORD
  776.                   If(Lower$(Param$)="link") or(Lower$(Param$)="alink")
  777.                      GT_NEXTWORD
  778.                      LINKTO$=Param$ : TYPE=__NODE
  779.                   Else If Lower$(Param$)="amos"
  780.                      GT_NEXTWORD
  781.                      LINKTO$=Param$ : TYPE=__AMOS
  782.                   Else 
  783.                      LINKTO$="main" : TYPE=__UNKNOWN
  784.                   End If 
  785.                   BUILD_LINK[C$,Y,XP,LINKTO$,TYPE] : XP=Param
  786.                   A=A+Len(C$)+3
  787.                End If 
  788.                B= Extension_16_009E(L$,125,A+2)+1
  789.                If B=1
  790.                   _ERRORMSG["Node contains unclosed Link"]
  791.                   Pop Proc
  792.                End If 
  793.                A= Extension_16_009E(L$,64,B-1)
  794.             End If 
  795.          End If 
  796.       Wend 
  797.       
  798.       TAB_OVER[Mid$(L$,B),XP]
  799.       MXP=Max(XP,MXP)
  800.       Add Y,10
  801.    Next Q
  802. End Proc[MXP]
  803. Procedure TAB_OVER[T$,XP]
  804.    TAB= Extension_16_008C(T$,9)
  805.    While TAB
  806.       T$=Left$(T$,TAB-1)+Space$(TABSIZE-((XP+TAB-1) mod TABSIZE))+Mid$(T$,TAB+1)
  807.       TAB= Extension_16_008C(T$,9)
  808.    Wend 
  809. End Proc[XP+Len(T$)]
  810. Procedure BUILD_LINK[T$,Y,XP,LINKTO$,TYPE]
  811.    Shared LINKS
  812.    
  813.    L= Extension_16_0C3C(ST_LINK)
  814.    TAB= Extension_16_008C(T$,9)
  815.    While TAB
  816.       T$=Left$(T$,TAB-1)+Space$(TABSIZE-((XP+TAB-1) mod TABSIZE))+Mid$(T$,TAB+1)
  817.       TAB= Extension_16_008C(T$,9)
  818.    Wend 
  819.     Extension_16_0DB8 L,ST_X1 To XP*8
  820.     Extension_16_0DB8 L,ST_Y1 To Y
  821.     Extension_16_0DB8 L,ST_X2 To(XP+Len(T$))*8+15
  822.     Extension_16_0DB8 L,ST_Y2 To Y+9
  823.     Extension_16_0DB8 L,ST_NEXT To LINKS
  824.     Extension_16_0D76 L,ST_NAME To Lower$(LINKTO$)
  825.     Extension_16_0DB8 L,ST_TYPE To TYPE
  826.    LINKS=L
  827. End Proc[XP+Len(T$)+2]
  828. Procedure _SHOW_LINKS[XO,YO]
  829.    Shared LINKS
  830.    
  831.    L=LINKS : XO=XO*8 : YO=YO*10-32
  832.    While L
  833.       X1= Extension_16_0D32(L,ST_X1)-XO
  834.       Y1= Extension_16_0D32(L,ST_Y1)-YO
  835.       X2= Extension_16_0D32(L,ST_X2)-XO
  836.       Y2= Extension_16_0D32(L,ST_Y2)-YO
  837.       
  838.       If Extension_16_07EA(X1,Y1,X2,Y2 To 0,32,Screen Width-16,Screen Height-10)
  839.          TBOX[X1,Y1,X2,Y2,False]
  840.       End If 
  841.       
  842.       L= Extension_16_0D32(L,ST_NEXT)
  843.    Wend 
  844. End Proc
  845. Procedure LINE_VIEW[LADDR,X,Y,XL]
  846.    Shared STYLE,QUOTED
  847.    L$= Extension_16_0292(LADDR,65535,10)
  848.    
  849.    B=1 : OS=Text Styles : Ink 3,2
  850.    A= Extension_16_008C(L$,64) : XP=0
  851.    While A
  852.       
  853.       If Mid$(L$,A-1,1)="\"
  854.          A= Extension_16_009E(L$,64,A)
  855.       Else 
  856.          TAB_TEXT[Mid$(L$,B,A-B),X,Y,XP,XL] : XP=Param
  857.          
  858.          
  859.          If((A>1) and Peek(LADDR+A-1)=92) or Peek(LADDR+A)<>123
  860.             '@ is escaped or not followed by { so ignore it. 
  861.             '
  862.             B=A : A= Extension_16_009E(L$,64,B)
  863.          Else 
  864.             GT_FIRSTWORD[Mid$(L$,A+2)] : C$=Param$
  865.             If QUOTED
  866.                TAB_TEXT[" "+C$+" ",X,Y,XP,XL] : XP=Param
  867.                A=A+Len(C$)+3
  868.             Else 
  869.                If C$="b"
  870.                   Bset 1,STYLE
  871.                Else If C$="ub"
  872.                   Bclr 1,STYLE
  873.                Else If C$="i"
  874.                   Bset 2,STYLE
  875.                Else If C$="ui"
  876.                   Bclr 2,STYLE
  877.                Else If C$="u"
  878.                   Bset 0,STYLE
  879.                Else If C$="uu"
  880.                   Bclr 0,STYLE
  881.                End If 
  882.             End If 
  883.             B= Extension_16_009E(L$,125,A+2)+1
  884.             If B=1 : Pop Proc : End If 
  885.             A= Extension_16_009E(L$,64,B-1)
  886.          End If 
  887.       End If 
  888.    Wend 
  889.    
  890.    Set Text STYLE
  891.    TAB_TEXT[Mid$(L$,B),X,Y,XP,XL]
  892.    
  893.    Set Text OS
  894. End Proc
  895. Procedure TAB_TEXT[T$,X,Y,XP,XL]
  896.    Shared STYLE
  897.    Set Text STYLE
  898.    TAB= Extension_16_008C(T$,9)
  899.    While TAB
  900.       T$=Left$(T$,TAB-1)+Space$(TABSIZE-((XP+TAB-1) mod TABSIZE))+Mid$(T$,TAB+1)
  901.       TAB= Extension_16_008C(T$,9)
  902.    Wend 
  903.    Text X+(XP-XL)*8,Y+Text Base+1,T$
  904. End Proc[XP+Len(T$)]
  905. Procedure _TEST_LINKS[XO,YO]
  906.    Shared LINKS
  907.    XM=X Screen(X Mouse) : YM=Y Screen(Y Mouse)
  908.    L=LINKS : XO=XO*8 : YO=YO*10-32 : LINKTO$=""
  909.    Clip 0,32 To Screen Width-16,Screen Height-10
  910.    While L
  911.       X1= Extension_16_0D32(L,ST_X1)-XO
  912.       Y1= Extension_16_0D32(L,ST_Y1)-YO
  913.       X2= Extension_16_0D32(L,ST_X2)-XO
  914.       Y2= Extension_16_0D32(L,ST_Y2)-YO
  915.       'If El Overlap(X1,Y1,X2,Y2 To 0,32,Screen Width-16,Screen Height-10) 
  916.       If(XM>=X1) and(XM<=X2) and(YM>=Y1) and(YM<=Y2)
  917.          TBOX[X1,Y1,X2,Y2,True]
  918.          Repeat : Until Mouse Key=0
  919.          TBOX[X1,Y1,X2,Y2,False]
  920.          If(XM>=X1) and(XM<=X2) and(YM>=Y1) and(YM<=Y2)
  921.             'Released Over Button
  922.             LINKTO$= Extension_16_0CF8(L,ST_NAME)
  923.             If Extension_16_0D32(L,ST_TYPE)=__AMOS
  924.                'Link is to an AMOS Program, so load it when pressed.
  925.                'and quit this program!
  926.                '
  927.                If Prg Under=1
  928.                   Call Editor 61,1,LINKTO$
  929.                   If Param=0
  930.                      _CLOSE_SCREEN : Edit 
  931.                   Else 
  932.                      _ERRORMSG["Can't load program "+LINKTO$]
  933.                      LINKTO$=""
  934.                   End If 
  935.                Else 
  936.                   _ERRORMSG["Can't load programs unless run as an accessory"]
  937.                   LINKTO$=""
  938.                End If 
  939.             Else If Extension_16_0D32(L,ST_TYPE)=__UNKNOWN
  940.                LINKTO$=""
  941.                
  942.             End If 
  943.          End If 
  944.       End If 
  945.       'End If  
  946.       L= Extension_16_0D32(L,ST_NEXT)
  947.    Wend 
  948.    Clip 0,0 To Screen Width,Screen Height
  949. End Proc[LINKTO$]
  950.  
  951. '********************
  952. 'About Pages 
  953.  
  954. Procedure ABOUT_DATABASE
  955.    Menu Off 
  956.    Cls 2,0,32 To Screen Width-16,Screen Height-10
  957.    Pen 7 : Paper 2
  958.    Print At(29,6);"Database Information"
  959.    Print At(10,9);"Name        :"
  960.    Print At(10,11);"Author      :"
  961.    Print At(10,13);"Copyright   :"
  962.    Print At(10,15);"Master File :"
  963.    Print At(10,17);"Version     :"
  964.    Pen 3
  965.    Print At(24,9); Extension_16_0CF8(DB,ST_NAME)
  966.    Print At(24,11); Extension_16_0CF8(DB,ST_AUTHOR)
  967.    Print At(24,13); Extension_16_0CF8(DB,ST_COPY)
  968.    Print At(24,15); Extension_16_0CF8(DB,ST_MASTER)
  969.    Print At(24,17); Extension_16_0CF8(DB,ST_VERSION)
  970.    Pen 7
  971.    Print At(20,20);"Press Left Mouse Button To Continue"
  972.    Repeat : Until Mouse Key and 1
  973.    Menu On 
  974. End Proc
  975. Procedure ABOUT_TEXT[MENU]
  976.    Menu Off 
  977.    Cls 2,0,32 To Screen Width-16,Screen Height-10
  978.    Pen 7 : Paper 2
  979.    Print At(18,8);"Amos Guide V1.02 - Amigaguide File Viewer"
  980.    Print At(28,10);"By Paul Hickman ï¿½1995"
  981.    Pen 0
  982.    Print At(17,15);"Distributed as part of the Easylife Package"
  983.    Pen 3
  984.    If MENU
  985.       Print At(20,20);"Press Left Mouse Button To Continue"
  986.       Repeat : Until Mouse Key and 1
  987.    Else 
  988.       Print At(33,20);"Please Wait..."
  989.    End If 
  990.    Menu On 
  991. End Proc
  992.  
  993. '********************* 
  994. 'Printing  
  995.  
  996. Procedure _PRINT_PAGE
  997.    Shared NODE$
  998.    A=1
  999.    Trap Printer Open 
  1000.    If Errtrap
  1001.       ERR_MESSAGE["Unable To Open Printer"]
  1002.       Pop Proc
  1003.    End If 
  1004.    If Printer Online=False
  1005.       ERR_MESSAGE["Printer is not on-line"]
  1006.       Printer Close 
  1007.       Pop Proc
  1008.    End If 
  1009.    Change Mouse 3
  1010.    Printer Send Chr$(13)
  1011.    Repeat 
  1012.       LINE_PRINT[ Extension_16_04DC(Mid$(NODE$,A,4))]
  1013.       Add A,4
  1014.    Until A>=Len(NODE$)
  1015.    Printer Send Chr$(10)
  1016.    Printer Close 
  1017.    Change Mouse 1
  1018. End Proc
  1019. Procedure LINE_PRINT[LADDR]
  1020.    Shared QUOTED
  1021.    L$= Extension_16_0292(LADDR,65535,10)
  1022.    B=1 : ESC$=Chr$(27)
  1023.    A= Extension_16_008C(L$,64) : XP=0 : P$="" : AB=False
  1024.    While A
  1025.       
  1026.       If Mid$(L$,A-1,1)="\"
  1027.          A= Extension_16_009E(L$,64,A)
  1028.       Else 
  1029.          TAB_PRINT[Mid$(L$,B,A-B),XP] : XP=XP+Len(Param$)
  1030.          P$=P$+Param$
  1031.          If((A>1) and Peek(LADDR+A-1)=92) or Peek(LADDR+A)<>123
  1032.             '@ is escaped or not followed by { so ignore it. 
  1033.             '
  1034.             B=A : A= Extension_16_009E(L$,64,B)
  1035.          Else 
  1036.             GT_FIRSTWORD[Mid$(L$,A+2)] : C$=Param$
  1037.             If QUOTED
  1038.                TAB_PRINT[" "+C$+" ",XP] : XP=XP+Len(Param$)
  1039.                A=A+Len(C$)+3 : P$=P$+Param$
  1040.             Else 
  1041.                If C$="b"
  1042.                   P$=P$+ESC$+"[1m"
  1043.                Else If C$="ub"
  1044.                   P$=P$+ESC$+"[22m"
  1045.                Else If C$="i"
  1046.                   P$=P$+ESC$+"[3m"
  1047.                Else If C$="ui"
  1048.                   P$=P$+ESC$+"[23m"
  1049.                Else If C$="u"
  1050.                   P$=P$+ESC$+"[4m"
  1051.                Else If C$="uu"
  1052.                   P$=P$+ESC$+"[24m"
  1053.                End If 
  1054.             End If 
  1055.             B= Extension_16_009E(L$,125,A+2)+1
  1056.             If B=1 : AB=True : Exit : End If 
  1057.             A= Extension_16_009E(L$,64,B-1)
  1058.          End If 
  1059.       End If 
  1060.    Wend 
  1061.    If Not AB Then TAB_PRINT[Mid$(L$,B),XP] : P$=P$+Param$
  1062.    NULL=Free
  1063.    Printer Send P$+Chr$(13)+Chr$(10)
  1064. End Proc
  1065. Procedure TAB_PRINT[T$,XP]
  1066.    TAB= Extension_16_008C(T$,9)
  1067.    While TAB
  1068.       T$=Left$(T$,TAB-1)+Space$(TABSIZE-((XP+TAB-1) mod TABSIZE))+Mid$(T$,TAB+1)
  1069.       TAB= Extension_16_008C(T$,9)
  1070.    Wend 
  1071. End Proc[T$]
  1072.  
  1073. '********************* 
  1074. 'General Support 
  1075.  
  1076. Procedure _ERRORMSG[A$]
  1077.    Cls 6,24,1 To Screen Width-8,9
  1078.    Ink 7 : Text 24,7,Left$(A$,74) : Wait 120
  1079. End Proc
  1080. Procedure GT_FIRSTWORD[A$]
  1081.    Shared GTSTR$
  1082.    GTSTR$=Left$(A$, Extension_16_0152(A$,32))
  1083.    GT_NEXTWORD
  1084. End Proc[Param$]
  1085. Procedure GT_NEXTWORD
  1086.    Shared GTSTR$,QUOTED
  1087.    A= Extension_16_00EA(GTSTR$,Chr$(32)+Chr$(9))
  1088.    If A=0 Then Pop Proc[""]
  1089.    A$=Mid$(GTSTR$,A)
  1090.    If Asc(A$)=34
  1091.       QUOTED=True
  1092.       B= Extension_16_009E(A$,34,1) : S=2
  1093.    Else 
  1094.       QUOTED=False
  1095.       B= Extension_16_00AA(A$," }") : S=1
  1096.    End If 
  1097.    If B=0 : B=Len(A$)+1 : End If 
  1098.    GTSTR$=Mid$(A$,B+1)
  1099. End Proc[Mid$(A$,S,B-S)]
  1100. Procedure TBOX[X1,Y1,X2,Y2,IN]
  1101.    A=3
  1102.    Ink A+IN*A
  1103.    Polyline X1,Y2-1 To X1,Y1 To X2,Y1
  1104.    Ink -IN*A
  1105.    Polyline X1,Y2 To X2,Y2 To X2,Y1+1
  1106. End Proc
  1107. Procedure SLIDER_READ[S]
  1108.    MX#= Extension_16_0D32(S,ST_MAX)
  1109.    POS#= Extension_16_0D32(S,ST_POS)
  1110.    BSIZE#= Extension_16_0D32(S,ST_BSIZE)
  1111.    
  1112.    P#=POS#
  1113.    Repeat 
  1114.       
  1115.       If Extension_16_0D32(S,ST_HORIZ)
  1116.          MP=X Screen(X Mouse)
  1117.          S1= Extension_16_0D32(S,ST_X1)
  1118.          S2= Extension_16_0D32(S,ST_X2)
  1119.       Else 
  1120.          MP=Y Screen(Y Mouse)
  1121.          S1= Extension_16_0D32(S,ST_Y1)
  1122.          S2= Extension_16_0D32(S,ST_Y2)
  1123.       End If 
  1124.       
  1125.       L#=(S2-S1)/(MX#+BSIZE#)
  1126.       If BSIZE#*L#<6.0
  1127.          BSIZE#=6.0/L#
  1128.          L#=(S2-S1)/(MX#+BSIZE#)
  1129.       End If 
  1130.       
  1131.       POS#=(MP-S1)/L#-BSIZE#/2.0
  1132.       
  1133.       If POS#>MX# Then POS#=MX#
  1134.       If POS#<0 Then POS#=0
  1135.       If(POS#<>P#)
  1136.           Extension_16_0DB8 S,ST_POS To POS#
  1137.          SLIDER_DRAW[S]
  1138.          P#=POS#
  1139.       End If 
  1140.    Until(Mouse Key=0)
  1141. End Proc[POS#]
  1142. Procedure SLIDER_DRAW[S]
  1143.    MX#= Extension_16_0D32(S,ST_MAX)
  1144.    POS#= Extension_16_0D32(S,ST_POS)
  1145.    BSIZE#= Extension_16_0D32(S,ST_BSIZE)
  1146.    X1= Extension_16_0D32(S,ST_X1) : Y1= Extension_16_0D32(S,ST_Y1)
  1147.    X2= Extension_16_0D32(S,ST_X2) : Y2= Extension_16_0D32(S,ST_Y2)
  1148.    
  1149.    Wait Vbl 
  1150.    If Not Extension_16_0D32(S,ST_HORIZ)
  1151.       L#=(Y2-Y1)/(MX#+BSIZE#)
  1152.       If BSIZE#*L#<6.0
  1153.          BSIZE#=6.0/L#
  1154.          L#=(Y2-Y1)/(MX#+BSIZE#)
  1155.       End If 
  1156.       Cls 0,X1,Y1 To X2,Y1+1+POS#*L#
  1157.       Cls 4,X1,Y1+1+POS#*L# To X2,Min(Y2-1,Y1+2+(POS#+BSIZE#)*L#)
  1158.       Cls 0,X1,Y1+2+(POS#+BSIZE#)*L# To X2,Y2-1
  1159.    Else 
  1160.       L#=(X2-X1)/(MX#+BSIZE#)
  1161.       If BSIZE#*L#<6.0
  1162.          BSIZE#=6.0/L#
  1163.          L#=(X2-X1)/(MX#+BSIZE#)
  1164.       End If 
  1165.       Cls 0,X1,Y1 To X1+1+POS#*L#,Y2
  1166.       Cls 4,X1+1+POS#*L#,Y1 To Min(X2-1,X1+2+(POS#+BSIZE#)*L#),Y2
  1167.       Cls 0,X1+2+(POS#+BSIZE#)*L#,Y1 To X2-1,Y2
  1168.    End If 
  1169. End Proc
  1170.  
  1171. '********************* 
  1172. 'Buffered File Input 
  1173. 'Routines. 
  1174.  
  1175. Procedure _FILE_READ[CH,F$]
  1176.    Shared BLOCK_SIZE,FR_PTR,FR_LEN,FR_POS,GMODE
  1177.    
  1178.    If F$=""
  1179.       GMODE=__DIR
  1180.       FR_LEN=Blength(BANK)
  1181.       FR_POS=0 : L=FR_LEN
  1182.    Else 
  1183.       'Read file for real
  1184.       Trap Open In CH,F$
  1185.       If Errtrap
  1186.          _ERRORMSG["Could not open file: "+F$]
  1187.          Pop Proc[0]
  1188.       End If 
  1189.       Reserve As Work 10000+CH,BLOCK_SIZE
  1190.       FR_LEN=Min(Lof(CH)-Pof(CH),BLOCK_SIZE)
  1191.       Sload CH To Start(10000+CH),FR_LEN
  1192.       FR_PTR=0 : FR_POS=0
  1193.       L=Lof(CH)
  1194.       If GMODE<>__KEYWORD : GMODE=__NORMAL : End If 
  1195.    End If 
  1196. End Proc[L]
  1197. Procedure _FILE_READ_LINE[CH]
  1198.    Shared BLOCK_SIZE,FR_PTR,FR_LEN,FR_POS,GMODE
  1199.    
  1200.    If GMODE=__DIR
  1201.       L$= Extension_16_0292(Bstart(BANK)+FR_POS,Blength(BANK)-FR_POS,10)
  1202.       Add FR_POS,Len(L$)+1
  1203.    Else 
  1204.       Do 
  1205.          P=FR_PTR
  1206.          ML=Max(1,Min(FR_LEN-FR_PTR,1024))
  1207.          L$= Extension_16_0292(Start(CH+10000)+FR_PTR,ML,10)
  1208.          If Len(L$)=ML
  1209.             'Reached The End Of This Segment 
  1210.             '
  1211.             Pof(CH)=Pof(CH)-FR_LEN+P : Rem pof=Start of this line           
  1212.             FR_LEN=Min(Lof(CH)-Pof(CH),BLOCK_SIZE)
  1213.             If FR_LEN<=ML : FR_POS=Lof(1) : Exit : End If 
  1214.             Sload CH To Start(10000+CH),FR_LEN
  1215.             FR_PTR=0
  1216.          Else 
  1217.             Exit 
  1218.          End If 
  1219.       Loop 
  1220.       Add FR_PTR,Len(L$)+1
  1221.       Add FR_POS,Len(L$)+1
  1222.    End If 
  1223.    
  1224. End Proc[L$]
  1225. Procedure _FILE_CLOSE[CH]
  1226.    Shared GMODE
  1227.    If GMODE<>__DIR
  1228.       Close CH
  1229.       Erase 10000+CH
  1230.    End If 
  1231. End Proc
  1232.  
  1233. '********************* 
  1234. 'Screen Setup
  1235.  
  1236. Procedure INIT_SCRN[SCX,SCY]
  1237.    
  1238.    Resource Screen Open 0,SCX,SCY,0
  1239.    
  1240.    Pen 3 : Paper 0
  1241.    Menu$(1)=" AmosGuide "
  1242.    Menu$(1,1)=" Open...         "
  1243.    Menu$(1,2)=" Command...      "
  1244.    Menu$(1,3)="-----------------"
  1245.    Menu$(1,4)=" Turbocharge     "
  1246.    Menu$(1,5)=" Print           "
  1247.    Menu$(1,6)="-----------------"
  1248.    Menu$(1,7)=" About AmosGuide "
  1249.    Menu$(1,8)=" About Database  "
  1250.    Menu$(1,9)="-----------------"
  1251.    Menu$(1,10)=" Quit            "
  1252.    Menu On 
  1253.    
  1254.    GRB_EDITOR_PALETTE
  1255.    Cls 0
  1256.    Cls 2,0,11 To SCX-16,SCY-9
  1257.    Ink 3 : Draw 4,29 To SCX-20,29
  1258.    Ink 0 : Draw 4,30 To SCX-20,30
  1259.    
  1260.    B1$="SI SW,SH;"
  1261.    B1$=B1$+"LI 24,0,28,"+Str$((SCX))+";"
  1262.    B1$=B1$+"PR 32,1,1VA,7;"
  1263.    B1$=B1$+"BUtton 1,0,0,24,16,0,0,1;[UNpack 0,0,22 BP+;][BR0;] KY 69 128+,0;"
  1264.    B2$="LIne 0,SY8-,47,SX48-;"
  1265.    B2$=B2$+"VLine SX16-,11,57,SY16-;"
  1266.    
  1267.    B3$="BUtton 2,SX12-,14,8,SY30-,0,0,1;[][NW;]"
  1268.    B3$=B3$+"BUtton 3,SX16-,SY16-,16,8,0,0,1;[UNpack 0,0,63 BP+;][NW;] KY 76 128+,0; KY 76 128+,3;"
  1269.    B3$=B3$+"BUtton 4,SX16-,SY8-,16,8,0,0,1;[UNpack 0,0,65 BP+;][NW;] KY 77 128+,0; KY 77 128+,3;"
  1270.    B3$=B3$+"BUtton 5,4,SY6-,SX56-,4,0,0,1;[][NW;]"
  1271.    B3$=B3$+"BUtton 6,SX48-,SY8-,16,8,0,0,1;[UNpack 0,0,53 BP+;][NW;] KY 79 128+,0; KY 79 128+,3;"
  1272.    B3$=B3$+"BUtton 7,SX32-,SY8-,16,8,0,0,1;[UNpack 0,0,55 BP+;][NW;] KY 78 128+,0; KY 78 128+,3;"
  1273.    B3$=B3$+"BUtton 8,8,12,88,14,0,0,1;[LI 0,0,88 BP3*+,88; PO 12,5,'Contents',0,3;][BR0;]"
  1274.    B3$=B3$+"BUtton 9,112,12,88,14,0,0,1;[LI 0,0,88 BP3*+,88; PO 24,5,'Index',0,3;][BR0;]"
  1275.    B3$=B3$+"BUtton 10,216,12,88,14,0,0,1;[LI 0,0,88 BP3*+,88; PO 8,5,'<< Browse',0,3;][BR0;]"
  1276.    B3$=B3$+"BUtton 11,320,12,88,14,0,0,1;[LI 0,0,88 BP3*+,88; PO 8,5,'>> Browse',0,3;][BR0;]"
  1277.    B3$=B3$+"BUtton 12,424,12,88,14,0,0,1;[LI 0,0,88 BP3*+,88; PO 16,5,'Retrace',0,3;][BR0;]"
  1278.    B3$=B3$+"BUtton 13,0,32,SX16-,SY10-,0,0,1;[][NW;]"
  1279.    B3$=B3$+"BUtton 14,528,12,88,14,0,0,1;[LI 0,0,88 BP3*+,88; PO 32,5,'Help',0,3;][BR0;]"
  1280.    NULL=Dialog Box(B1$+B2$+B3$+"EX;",,"Initialising Database...")
  1281.    
  1282.    R$=B1$+B3$+"EX;"
  1283.    Dialog Open 1,R$
  1284.    ABOUT_TEXT[False]
  1285. End Proc
  1286. Procedure INIT_SLIDERS
  1287.    Shared HSLD,VSLD
  1288.    
  1289.    HSLD= Extension_16_0C3C(ST_SLIDER)
  1290.     Extension_16_0DB8 HSLD,ST_X1 To 4
  1291.     Extension_16_0DB8 HSLD,ST_Y1 To Screen Height-6
  1292.     Extension_16_0DB8 HSLD,ST_X2 To Screen Width-52
  1293.     Extension_16_0DB8 HSLD,ST_Y2 To Screen Height-2
  1294.     Extension_16_0DB8 HSLD,ST_BSIZE To(Screen Width-16)/8
  1295.     Extension_16_0DB8 HSLD,ST_HORIZ To True
  1296.    
  1297.    VSLD= Extension_16_0C3C(ST_SLIDER)
  1298.     Extension_16_0DB8 VSLD,ST_X1 To Screen Width-12
  1299.     Extension_16_0DB8 VSLD,ST_Y1 To 13
  1300.     Extension_16_0DB8 VSLD,ST_X2 To Screen Width-4
  1301.     Extension_16_0DB8 VSLD,ST_Y2 To Screen Height-16
  1302.     Extension_16_0DB8 VSLD,ST_BSIZE To(Screen Height-40)/10
  1303.    
  1304. End Proc
  1305. Procedure _CLOSE_SCREEN
  1306.    '   Dialog Close 1 
  1307.    '   Screen Close 0 
  1308. End Proc
  1309. Procedure GRB_EDITOR_PALETTE
  1310.    'Copy the 8 editor colours to the current screen.
  1311.    'NOTE: Colour 1 should be made to flash. 
  1312.    '
  1313.    Shared EDAT
  1314.    If EDAT=0
  1315.       Palette 0,$6F,$77,$EEE,$F00,$DD,$AA,$FF3
  1316.    Else 
  1317.       For C=0 To 7
  1318.          Colour C,Deek(EDAT+28+C*2)
  1319.       Next C
  1320.    End If 
  1321. End Proc
  1322. Procedure STRING_REQUEST[TIT$,TXT$,ST$]
  1323.    Resource Bank 0
  1324.    Resource Screen Open 2,416,64,0
  1325.    Screen Display 2,176,Display Height-200+25*Ntsc,,
  1326.    GRB_EDITOR_PALETTE
  1327.    S$="SI 416,64; BA SW SX- 2/,SH SY- 2/;"
  1328.    S$=S$+"BO 0,0,1,SX,SY; PO 0VA CX,6,0VA,0,7; "
  1329.    S$=S$+"LI 0,14,94,SX; LI 152,24,17,SX 24-; "
  1330.    S$=S$+"PO 16,28,2 VA,0,3; ED 3,160,28,28,256,1 VA,2,5; "
  1331.    
  1332.    O$="BU 1,SX 144-,SY 20-,64,14,0,0,1;[UN 0,0,13 BP+; PO 8,5,'Cancel',0,4;][BQ;] KY 128 69+,0; "
  1333.    O$=O$+"BU 2,SX 80-,SY 20-,64,14,0,0,1;[UN 0,0,13 BP+; PO 24,5,'OK',0,4;][BQ;] KY 13,0; "
  1334.    
  1335.    Dialog Open 2,S$+O$+"RU 0,3; EX;",10,2048
  1336.    Vdialog$(2,0)=TIT$
  1337.    Vdialog$(2,1)=ST$
  1338.    Vdialog$(2,2)=TXT$
  1339.    NULL=Dialog Run(2)
  1340.    
  1341.    Repeat 
  1342.       D=Dialog(2)
  1343.    Until D<3
  1344.    
  1345.    If Rdialog(2,1)=1
  1346.       'Cancel
  1347.       '
  1348.       Dialog Close 2
  1349.       Screen Close 2
  1350.       Pop Proc[""]
  1351.    End If 
  1352.    
  1353.    ST$=Rdialog$(2,3)
  1354.    Dialog Close 2
  1355.    Screen Close 2
  1356. End Proc[ST$]
  1357. Procedure ERR_MESSAGE[M$]
  1358.    Bell 
  1359.    Vdialog$(1,1)=M$
  1360.    NULL=Dialog Run(1)
  1361.    Wait 100
  1362. End Proc